/*
 * @lc app=leetcode.cn id=448 lang=javascript
 *
 * [448] 找到所有数组中消失的数字
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDisappearedNumbers = function (nums) {
  /**
   * 1. 首先题目只是要我们找出数组中消失的数字，且希望空间复杂度低，并没有说明我们不能更改原数组
   * 2. 思路就是只要某个数字出现，那么就将对应索引位置上的元素加上数组的长度
   * 3. 一圈遍历操作下来之后，如果数组中某个元素的值小于数组的长度，那么就说明它这个位置元素从来没有出现过，因为如果出现过就一定会增加上数组的长度
   */
  const len = nums.length;
  for (const num of nums) {
    const x = (num - 1) % len;
    nums[x] += len;
  }
  const ret = [];
  for (const [i, num] of nums.entries()) {
    if (num <= len) {
      ret.push(i + 1); // 这个位置索引上对应的数字不存在（从1开始，所以要+1）
    }
  }
  return ret;
};
// @lc code=end
